#ifndef CLIENTSOCKET_H
#define CLIENTSOCKET_H

#include <QObject>
#include <QTcpSocket>
#include <QFile>
// 消息类型枚举（应该在头文件中定义，这里为了清晰放在这里）
// 在 unit.h 或 clientsocket.h 中确保有这些定义
#include"unit.h"
#include"global.h"
class ClientSocket : public QObject
{
    Q_OBJECT
public:
    explicit ClientSocket(QObject *parent = nullptr);
    ~ClientSocket();
    //公共接口设计

    //用户身份管理，用户ID是系统中每个用户的唯一标识符，类似于身份证号码
    int GetUserId()const;//获取id值，const表示不修改对象状态
    void SetUserId(const int &id);//设置id

    void CheckConnected();//检查当前客户端的连接状态，如果为连接则重新自动连接
    void ColseConnected();//

    //连接服务器，两种的目的：这两种重载形式提供了灵活性和便利性
    // 形式1：使用 QString 主机地址（域名）
    void ConnectToHost(const QString &host, const int &port);
    // 形式2：使用 QHostAddress 主机地址（以及解析过的地址）
    void ConnectToHost(const QHostAddress &host, const int &port);

signals: //信号确实只需要声明，而不需要定义（实现）
    //传递从服务器接收到的业务数据消息
    void signalMessage(const quint8 &type, const QJsonValue &dataVal);
    //传递客户端自身的连接状态变化
    void signalStatus(const quint8 &state);
public slots:
    //消息发送
    void SltSendMessage(const quint8 &type,const QJsonValue &dataVal);
    void SltSendOnline();//上线通知
    //void SltSendOffline();//下线通知
private slots:
    //连接到服务器的通知
    void SltConnected();//与服务器建立好连接
    void SltReadyRead();//收到服务器的消息
    void SltDisconnected();//与服务器断开连接

private:
    //解析登录返回信息
    void ParseLogin(const QJsonValue &dataVal);
    //解析注册返回信息
    void ParseReister(const QJsonValue &dataVal);
    private:
    QTcpSocket*m_tcpSocket;//TCP socket核心对象,客户端的套接字
        int m_nId;//当前用户ID
};

#endif // CLIENTSOCKET_H
